home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / ingres04.lzh / source / iutil / getequal.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-01-23  |  2.0 KB  |  105 lines

  1. # include    <ingres.h>
  2. # include    <access.h>
  3. # include    <sccs.h>
  4.  
  5. SCCSID(@(#)getequal.c    8.1    12/31/84)
  6.  
  7.  
  8. /*
  9. **    getequal - get the first tuple equal to the provided key
  10. **    
  11. **    GETEQUAL is used to do a keyed retrieval of a single
  12. **    tuple in cases where the calling program knows the key to
  13. **    be unique.  SETKEY must be called first to set all desired
  14. **    domain values.  GETEQUAL will return the first tuple with
  15. **    equality on all of the specified domains.
  16. **    The tuple is returned in TUPLE.
  17. **    
  18. ** NOTE:
  19. **    This function used to call get() for the scan, I have exploded the
  20. **    call for efficency reasons. I also call get_page only when we leave a
  21. **    page boundary.
  22. **
  23. **    function values:
  24. **    
  25. **        <0 fatal error
  26. **         0  success
  27. **         1  no match
  28. **
  29. **    Trace Flags:
  30. **        23.8-15
  31. */
  32.  
  33.  
  34. getequal(d, keyval, tupleval, tid)
  35. register DESC    *d;
  36. char        keyval[MAXTUP];
  37. char        tupleval[MAXTUP];
  38. register    TID        *tid;
  39. {
  40.     auto        long    lpageid,pageid;
  41.     TID        limtid;
  42.     register    char    *tuple;
  43.     register    char    *key;
  44.     register    int    i;
  45.  
  46.     key = keyval;
  47.     tuple = tupleval;
  48.  
  49. #    ifdef xATR1
  50.     if (tTf(23, 8))
  51.     {
  52.         printf("getequal: %.14s,", d->reldum.relid);
  53.         printdesc(d);
  54.         printup(d, key);
  55.     }
  56. #    endif
  57.     if (i = find(d, EXACTKEY, tid, &limtid, key))
  58.         return (i);
  59.  
  60.     pluck_page(&limtid,&lpageid);
  61.     if (i = get_page(d, tid))
  62.         return ( i );
  63.  
  64.     for (;;)
  65.     {
  66.  
  67.         do
  68.         {
  69.             while (((++(tid->line_id)) & I1MASK) >= Acc_head->nxtlino)
  70.             {
  71.                 tid->line_id = -1;
  72.                 pageid = Acc_head->ovflopg;
  73.                 stuff_page(tid, &pageid);
  74.                 if (pageid == 0)
  75.                 {
  76.                     pageid = Acc_head->mainpg;
  77.                     stuff_page(tid, &pageid);
  78.                     if (pageid == 0 || pageid == lpageid + 1)
  79.                         return (1);
  80.                 }
  81.                 if (i = resetacc(Acc_head))
  82.                     return (i);
  83.                 if (i = get_page(d, tid))
  84.                     return (i);
  85.             }
  86.         } while (!Acc_head->linetab[-(tid->line_id & I1MASK)]);
  87.  
  88.         get_tuple(d,tid,tuple);
  89.  
  90.         if (!kcompare(d, key, tuple))
  91.         {
  92. #            ifdef xATR2
  93.             if (tTf(23, 9))
  94.             {
  95.                 printf("getequal: ");
  96.                 dumptid(tid);
  97.                 printf("getequal: ");
  98.                 printup(d, tuple);
  99.             }
  100. #            endif
  101.             return (0);
  102.         }
  103.     }
  104. }
  105.